class Student {
    public String name;
    public int age;
    public Student(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public String toString() {
        return "姓名: " + this.name + "  年龄: " + this.age;
    }
}
public class Test {
    public static void main(String[] args) {
        //字符串不可变性
        //final 修饰类 -> 表示类不能被继承
        //final 修饰数组 -> 表示引用不能再指向其他对象
        //不可变性原因,被private修饰,并没有给予get,set方法,导致无法发生改变
    }
    public static void main13(String[] args) {
        //字符串截取 substring
        String str1 = "hello";
        //从下标beginIndex位置开始截取
        System.out.println(str1.substring(1));
        //截取范围,(]
        System.out.println(str1.substring(1,3));
        System.out.println("===============");
        //去掉两端空格
        String str2 = "   hello world    ";
        System.out.println(str2.trim());
    }
    public static void main12(String[] args) {
        //字符串拆分 split
        String str1 = "hello&world";
        //进行分割,字符串.spilt("字符")
        String[] ret1 = str1.split("&");
        for(int i = 0;i < ret1.length;i++) {
            System.out.println(ret1[i]);
        }
        //拆分为多少组,拆分组数大于最多组数,则全部分组完即可
        String str2 = "hello world bit ";
        String[] ret2 = str2.split(" ",2);
        for(int i = 0;i < ret2.length;i++) {
            System.out.println(ret2[i]);
        }
        //拆分ip地址
        String str3 = "192.168.100";
        String[] ret3 = str3.split("\\.");
        for(int i = 0;i < ret3.length;i++) {
            System.out.println(ret3[i]);
        }
        String str4 = "ab&cd@ef%sg";
        String[] ret4 = str4.split("&|@|%");
        for(int i = 0;i < ret4.length;i++) {
            System.out.println(ret4[i]);
        }
        //注:特殊字符
        //1. 存在 * | + .进行分割时,需要使用\\进行转义拆分
        //2. 如果存在/,转义需要使用\\\\进行转义拆分
        //3. 如果存在多个分割符,可以使用|进行分割
        String str5 = "name=张三&age=18";
        String[] ret5 = str5.split("&");
        for(String x : ret5) {//类型,打印
            String[] s = x.split("=");
            for(String ss: s) {
                System.out.println(ss);
            }
        }
        //嵌套循环进行多次分割
    }
    public static void main11(String[] args) {
        //字符串替换 replace
        //替换字符串单个字符为其他字符
        String str1 = "abababasdgsngodsanab";
        System.out.println(str1.replace('a','k'));
        //重载 -> 替换字符串为其他字符串
        System.out.println(str1.replace("ab","kkk"));
        //非重载 -> 替换字符串所有regex为其他字符串
        System.out.println(str1.replaceAll("ab","aaa"));
        //替换第一次出现的字符串为...
        System.out.println(str1.replaceFirst("ab","do"));
    }
    public static void main10(String[] args) {
        //格式化 format
        String str1 = String.format("%d-%d-%d",2019,1,1);
        System.out.println(str1);
    }
    public static void main9(String[] args) {
        //字符串转数组 字符串.toCharArray()
        String str1 = "hello";
        char[] array = str1.toCharArray();
        for(char ch : array) {
            System.out.println(ch);
        }
    }
    public static void main8(String[] args) {
        //大小写转换 toUpperCase
        String str1 = "hello";
        System.out.println(str1.toUpperCase());
        //大转小
        String str2 = "HELLO";
        System.out.println(str2.toLowerCase());
        //注:并不是在原来字符串基础上发生改变,而是创建了字符串
    }
    public static void main7(String[] args) {
        //转化
        //数值和字符串转化 String.valueOf(数值)
        String str1 = String.valueOf(10);
        String str2 = String.valueOf('a');
        String str3 = String.valueOf(12.5f);
        String str4 = String.valueOf(12.5);
        String str5 = String.valueOf(true);
        String str6 = String.valueOf(new Student("张三",18));
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
        System.out.println(str5);
        System.out.println(str6);
        System.out.println("---------------");
        //字符串转数字 变量类型包装类.parse变量类型("String类")
        int data1  = Integer.parseInt("123");
        double data2 = Double.parseDouble("123");
        System.out.println(data1);
        System.out.println(data2);
    }
    public static void main6(String[] args) {
        //字符串查找
        String str1 = new String("hello");
        //查找字符串中下标对应字母 charAt
        System.out.println(str1.charAt(1));
        System.out.println("--------------");
        //返回字符串中字母对应的下标
        System.out.println(str1.indexOf('l'));
        //formIndex  -> 从这个位置开始查找字母,并返回对应的下标
        System.out.println(str1.indexOf('e',2));
        System.out.println("--------------");
        //返回第一次出现的位置
        System.out.println(str1.indexOf(1));
        //formIndex  -> 从这个位置开始查找数字,并返回对应的下标
        System.out.println(str1.indexOf(3,2));
        System.out.println("--------------");
        //从后往前查找字母对应的下标
        System.out.println(str1.lastIndexOf('l'));
        //从后往前从固定位置开始查找
        System.out.println(str1.lastIndexOf('l',4));
        System.out.println("--------------");
        //从后往前查找数字对应的下标
        System.out.println(str1.lastIndexOf(1));
        //从后往前从固定位置开始查找数字
        System.out.println(str1.lastIndexOf(1,4));
    }
    public static void main5(String[] args) {
        //忽略大小写进行比较相等,大小
        String str1 = new String("hello");
        String str2 = new String("HELLO");
        System.out.println(str1.equalsIgnoreCase(str2));
        System.out.println(str1.compareToIgnoreCase(str2));
    }
    public static void main4(String[] args) {
        //比较大小compareTo(返回 整数)
        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println(str1.compareTo(str2));//大于0 str1 大,等于0 相等,小于0,str2,大

    }
    public static void main3(String[] args) {
        //判断是否相等 equals(返回true/false)
        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println(str1 == str2);//直接比较地址,无论如何都不会相同
        System.out.println(str1.equals(str2));//相同,true,相反,false

        //直接赋值,会把字符串放在堆上面的常量池,所以直接比较可以进行判断
        String str4 = "hello";
        String str5 = "hello";
        System.out.println(str4 == str5);
        System.out.println(str4.equals(str5));
    }
    public static void main2(String[] args) {
        //使用new,表示在栈上开辟空间,并引用指向该对象
        String str1 = "hello";
        String str2 = "world";
        //str3引用指向了str1引用指向的对象
        String str3 = str1;
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        //求字符串长度
        System.out.println(str1.length());
        //判空
        String str4 = "";
        //如果指向null,证明该引用不指向任何对象,如果判空,将会发生空指针异常
        String str5 = null;
        System.out.println(str4.isEmpty());
        System.out.println(str5.isEmpty());//error,空指针异常
    }
    public static void main1(String[] args) {
        //String 类
        //创建String类的三种方法
        String str1 = "hello";

        String str2 = new String("world");

        char[] array = {'j','a','v','a'};
        String str3 = new String(array);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
}
